home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / DLL / SOURCE / SS1.CPP < prev   
Encoding:
C/C++ Source or Header  |  1997-11-24  |  2.4 KB  |  121 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <mem.h>
  4.  
  5. #define GLOBALS
  6. #include "div.h"
  7.  
  8. char pal[1024];
  9. char paleta[256];
  10. char orden[256];
  11.  
  12. int r,g,b;
  13.  
  14. char find_ord(char *);
  15.  
  16. void ord_paleta(void);
  17. void flip(void);
  18.  
  19. void ss_init(void)
  20. {
  21.   int n;
  22.   ord_paleta();
  23.   for (n=0;n<256;n++)
  24.     orden[paleta[n]]=n;
  25. }
  26.  
  27. void ss_frame(void)
  28. {
  29.   int m,n,y,counter=0;
  30.   char c1,c2;
  31.  
  32.   for (m=0;m<32;m++) {
  33.     for (n=0;n<wide;n++) {
  34.       y=div_rand(0,height-2);
  35.       c1=(int)*(buffer+n+y*wide);
  36.       c2=(int)*(buffer+n+(y+1)*wide);
  37.       if (orden[c1]>orden[c2]) {
  38.         *(buffer+n+(y+1)*wide)=c1;
  39.         *(buffer+n+y*wide)=c2;
  40.         counter++;
  41.       } else {
  42.         if (div_rand(0,1)) {
  43.           if (n>0) {
  44.             c2=(int)*(buffer+n+(y+1)*wide-1);
  45.             if (orden[c1]>orden[c2]) {
  46.               *(buffer+n+(y+1)*wide-1)=c1;
  47.               *(buffer+n+y*wide)=c2;
  48.             }
  49.           }
  50.         } else {
  51.           if (n<wide-1) {
  52.             c2=(int)*(buffer+n+(y+1)*wide+1);
  53.             if (orden[c1]>orden[c2]) {
  54.               *(buffer+n+(y+1)*wide+1)=c1;
  55.               *(buffer+n+y*wide)=c2;
  56.             }
  57.           }
  58.         }
  59.       }
  60.     }
  61.   }
  62.   if (counter<wide/2) flip();
  63. }
  64.  
  65. void ord_paleta(void) {
  66.   char c;
  67.   int n;
  68.  
  69.   n=0; do {
  70.     pal[n*4+3]=(pal[n*4]=palette[n*3])+(pal[n*4+1]=palette[n*3+1])+(pal[n*4+2]=palette[n*3+2]);
  71.   } while (++n<256);
  72.  
  73.   r=0; g=0; b=0;
  74.  
  75.   n=0; do {
  76.     c=find_ord(pal);
  77.     r=pal[c*4]; g=pal[c*4+1]; b=pal[c*4+2];
  78.     pal[c*4]=255; paleta[n]=c;
  79.   } while (++n<256);
  80.  
  81. }
  82.  
  83. char find_ord(char * dac) {
  84.  
  85.   int dmin,dif,r2,g2,b2;
  86.   char *pal,*endpal,*color;
  87.  
  88.   pal=dac; endpal=dac+1024; dmin=65536;
  89.   if (r<0) r=0; else if (r>63) r=63;
  90.   if (g<0) g=0; else if (g>63) g=63;
  91.   if (b<0) b=0; else if (b>63) b=63;
  92.   do {
  93.     if (*pal!=255) {
  94.       dif=(r-(int)*pal)*(r-(int)*pal); pal++;
  95.       dif+=(g-(int)*pal)*(g-(int)*pal); pal++;
  96.       dif+=(b-(int)*pal)*(b-(int)*pal); pal+=2;
  97.       if (dif<dmin) { dmin=dif; color=pal-4; }
  98.     } else pal+=4;
  99.   } while (pal<endpal);
  100.  
  101.   return((color-dac)/4);
  102. }
  103.  
  104. void flip(void) {
  105.   int n;
  106.   for (n=0;n<=height/2;n++) {
  107.     memcpy(pal,buffer+n*wide,wide);
  108.     memcpy(buffer+n*wide,buffer+(height-n-1)*wide,wide);
  109.     memcpy(buffer+(height-n-1)*wide,pal,wide);
  110.   }
  111. }
  112.  
  113. void __export divmain(COMMON_PARAMS)
  114. {
  115.   AutoLoad();
  116.   GLOBAL_IMPORT();
  117.   DIV_export("ss_init",ss_init);
  118.   DIV_export("ss_frame",ss_frame);
  119. }
  120.  
  121.